package com.ewancle.studiousfamilybackend.controller.rsocket;

import org.springframework.stereotype.Controller;

// RSocket 提供以下 4 种不同的通信模型：https://www.cundage.com/article/rsocket-tutorial.html#google_vignette
@Controller
public class HelloController {

    // 请求-响应:在这种方法中，每个请求都会收到一个响应。因此，我们使用基数为 1 的Mono请求，并收到基数相同的Mono响应
    /*@MessageMapping("hello")
    public Mono<String> hello(Mono<String> input) {
        //return Mono.just("Hello: " + input);
        return input.doOnNext(msg -> System.out.println("请求-响应 请求数据 :" + msg + ",Request!"))
                .map(msg -> msg + ",Response!");
    }

    // 请求流形式：当我们订阅时事通讯时，我们会从服务器定期收到更新流。当客户端发出初始请求时，服务器会发送数据流作为响应
    // 请求可以是Mono或Void，但响应将始终是Flux
    @MessageMapping("counter")
    public Flux<String> counter() {
        return Flux.range(1, 10)
                .map(i -> "服务端发送-数据流响应: " + i);
    }

    // 一劳永逸:当我们通过邮件寄出一封信时，我们通常只是将其放入邮箱中，并不期望收到回复。类似地，在“即发即弃”上下文中，响应可以为null或单个Mono
    @MessageMapping("warning")
    public Mono<Void> warning(Mono<String> error) {
        error.doOnNext(e -> System.out.println("即发即弃模式去-请求数据 :" + e))
                .subscribe();
        return Mono.empty();
    }

    // 渠道:想象一下一个允许双向通信的对讲机，双方可以同时说和听，就像进行对话一样。这种类型的通信依赖于发送和接收数据Flux
    @MessageMapping("channel")
    public Flux<String> channel(Flux<String> input) {
        return input.doOnNext(i -> {
                    System.out.println("双向通信-接收到 : " + i);
                })
                .map(m -> m.toUpperCase())
                .doOnNext(r -> {
                    System.out.println("双向通信-发送响应 :" + r);
                });
    }*/
}
